/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package stud.cp.core.plugins;

import javax.servlet.GenericServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Маршрутизатор действий.
 * @author Morfant
 */
public class PluginRouter {
    /*
     * Ключ, по которому мы будем получать  URL из файла actions.property.
     */

    private final String key;
    /*
     * Метод, который будет использован для перенаправления запроса.
     * =========================================================*
     * >>> sendRedirect() :
     * >> 1. Отсылает специальный хедер браузеру,
     * и браузер сам делаем редирект
     * (т.е. для вас после редиректа просто придет новый запрос от браузера)
     *  >> 2. После редиректа меняеться URL в браузере
     *  >> 3. Объекты, помещенные в оригинальный request будут недоступны.
     * =========================================================*
     * >>> forward() :
     * >> 1. Переходит на новую страницу в пределах контейнера, причем браузер будет абсолютно об этом не в курсе.
     * >> 2. URL в браузере не измениться, хотя пользователь физически будет находиться на другой странице.
     * >> 3. Объекты, помещенные в оригинальный request будут доступны.
     */
    private final boolean isForward;

    /**
     * Конструктор, который по умолчанию использует для перенаправления
     * запроса метод forward().
     * @param key Ключ, по которому мы будем получать  URL из файла actions.property.
     */
    public PluginRouter(String key) {
        this(key, true);
    }

    /**
     * Конструктор, который позоволяет задать
     * метод перенапраления запроса.
     * @param key Ключ, по которому мы будем получать  URL из файла actions.property.
     * @param isForward ? forward : redirect
     */
    public PluginRouter(String key, boolean isForward) {
        this.key = key;
        this.isForward = isForward;
    }

    /**
     * Метод, который непосредственно перенаправляет запрос.
     * @param servlet Сервлет, запрашивыющий действие.
     * @param req Объект предоставляющий HTTP запрос.
     * @param res Объект продоставляющий HTTP ответ.
     * @throws java.io.IOException Ошибки ввода/вывода.
     * @throws javax.servlet.ServletException Ошибка сервлета высшего уровня.
     */
    public synchronized void route(GenericServlet servlet,
            HttpServletRequest req,
            HttpServletResponse res)
            throws java.io.IOException,
            javax.servlet.ServletException {
        if (isForward) {
            // Используем метод forward() для перенаправления запроса.
            servlet.getServletContext().getRequestDispatcher(
                    res.encodeURL(key)).forward(req, res);
        } else {
            // Используем метод sendRedirect() для перенаправления запроса.
            res.sendRedirect(res.encodeRedirectURL(key));
        }
    }
}
